package com.cskaoyan.javase.exception._1handle._3throws;

/**
 * @description: 方法覆盖中父子类方法的异常声明列表的问题
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import org.omg.CORBA.UserException;

import javax.xml.xpath.XPathException;

/**
 * 方法的声明:
 * [访问权限修饰符] [其它修饰符] 返回值类型 方法名(形参列表) throws 异常列表{
 *     //方法体
 * }
 * 方法的重载 vs 方法的重写
 *
 * 方法重写中子类方法重写父类方法,异常声明列表的大原则是: 重写的子类方法不能抛出更多的异常(声明)
 *
 * 什么叫不能抛出更多的异常?
 *      注意抛出更多的运行时异常,不叫抛出更多的异常
 *
 * 如果父类方法没有异常,那么
 *      子类重写的方法,只能抛出更多的运行时异常,或者保持一致,不能抛出更多的编译时异常
 *
 * 如果父类方法抛出运行时异常,那么
 *      子类重写的方法,只能抛出更多的运行时异常,或者保持一致,不能抛出更多的编译时异常
 *
 * 如果父类方法抛出某几个编译时异常,那么
 *      子类重写的方法,可以不抛出,可以抛出运行时异常,可以抛出编译时异常,
 *          但是只能抛出父类已经抛出的,不能抛出父类声明中没有的编译时异常
 *
 *如果父类方法直接抛出Exception,那么
 *      子类重写的方法可以随便抛出
 *
 * 总之,子类重写父类的方法,不能比父类抛出更多的编译时异常
 *
 * 思考一下原因:
 *      因为编译时异常一旦被抛出需要在方法的调用处处理它,
 *      如果允许子类方法抛出更多的编译时异常,就会出现矛盾的情况--->
 *          按照多态现象,编译时看左边,运行时看右边
 */
public class Demo2 {
    public static void main(String[] args) {

    }
}
class Father{
    public void test () throws Exception{}
}
class Son extends Father{
    //'test()' in 'com.cskaoyan.javase.exception._1handle._3throws.Son' clashes with 'test()' in 'com.cskaoyan.javase.exception._1handle._3throws.Father'; overridden method does not throw 'org.omg.CORBA.UserException'
    @Override
    public void test() throws RuntimeException,CloneNotSupportedException, XPathException,UserException,Exception {
    }
}